﻿using EnqueteMobile.Repository.Base;
using EnqueteMobile.Repository.Database.Model;
using EnqueteMobile.Repository.Database.Model.UserObjects;
using EnqueteMobile.Repository.Database.RepositoriesInterfaces;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;

namespace EnqueteMobile.Repository.Database.EntityFramework.Repositories
{
    public class FederalUnitRepository : Repository<UnidadeFederativa>, IFederalUnitRepository
    {
        private MobilePollUnitOfWork unitOfWork;

        /// <summary> Construtor </summary>
        /// <param name="context"></param>
        public FederalUnitRepository(MobilePollContext context) : base(context)
        {
            unitOfWork = new MobilePollUnitOfWork();
        }

        public UnidadeFederativa Insert(string nome, string sigla)
        {
            UnidadeFederativa uf = new UnidadeFederativa();
            uf.Nome = nome;
            uf.Sigla = sigla;

            return entity.Add(uf);
        }

        public UnidadeFederativa Insert(UnidadeFederativa uf)
        {
            return entity.Add(uf);
        }

        public UnidadeFederativa GetBySigla(string sigla)
        {
            return entity.Where(uf => uf.Sigla.Equals(sigla)).FirstOrDefault();
        }


        public new UnidadeFederativa Update(UnidadeFederativa uf)
        {
            Boolean existUnidadeFederativa = entity.Where(a => a.Id == uf.Id).Any();
            if(!existUnidadeFederativa)
            {
                throw new ArgumentException(String.Format("Unidade Federativa não encontrada com o id {0}", uf.Id));
            }

            TransactionOptions option = new TransactionOptions()
            {
                IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted,
                Timeout = new TimeSpan(0, 10, 0)
            };

            using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, option))
            {
                base.Update(uf);
                scope.Complete();
            }

            return uf;
        }
    }
}